Conversation
|
Your Claude subscription has hit its usage limit. It resets at 11:30am (UTC). Re-trigger Pullfrog after the reset, or add an Add repo secret → · Model settings → · Setup docs → · Ask in Discord →
|
Greptile SummaryThe PR adds conversation-version navigation and non-destructive prompt rewriting across the engine, client, workbench, and presentation layers.
Confidence Score: 5/5The PR appears safe to merge; no actionable new failure or outstanding repository-rule violation was identified. The follow-up changes correctly keep live error-reporting metadata transient while preserving deterministic operation replay, and they reject cross-session operation-ID reuse without affecting correctly generated submissions.
|
| Filename | Overview |
|---|---|
| packages/host/engine/src/conversation/turn-service.ts | Persists and settles graph turns, announces shape and terminal-state changes, and keeps live-only failure-reporting metadata out of replayed records. |
| packages/host/engine/src/session/lifecycle-service.ts | Adds explicit-parent submission admission, cross-session operation ownership checks, and failure cleanup for launch and dispatch paths. |
| packages/client/core/src/conversation-store.ts | Adds frozen projection stores so parked lineage reads do not consume events from the active run. |
| packages/client/workbench/src/surface/lineage.ts | Implements lineage traversal, sibling version selection, active-lineage detection, and safe continuation-parent selection. |
| packages/client/workbench/src/surface/workbench.tsx | Integrates parked-version navigation, explicit-parent rewrites and continuations, and return-to-default behavior. |
| packages/presentation/ui/src/chat/turn-version-nav.tsx | Adds the user-facing version navigation controls and turn-state presentation. |
Sequence Diagram
sequenceDiagram
participant UI as Workbench UI
participant Client as Client Core
participant Engine as Host Engine
participant Store as Conversation Store
UI->>Client: Read selected leafTurnId
Client->>Engine: conversation.read(leafTurnId)
Engine->>Store: Load root-to-leaf projection
Store-->>Engine: Lineage events and graph revision
Engine-->>Client: Projection seed
Client-->>UI: Live store or frozen parked store
alt Rewrite an existing prompt
UI->>Client: submitTurn(input, parent, revision)
Client->>Engine: turn.submit with explicit parent
Engine->>Store: Validate revision and persist sibling
Engine-->>Client: turn.submitted
Engine-->>UI: conversation.graph.changed
else Continue from a parked version
UI->>Client: submitTurn(input, last completed turn, revision)
Client->>Engine: turn.submit with explicit parent
Engine->>Store: Persist child and move default leaf
Engine-->>UI: conversation.graph.changed
end
Reviews (3): Last reviewed commit: "fix(workbench): mirror the daemon's sett..." | Re-trigger Greptile
73fc5ff to
992dff7
Compare
|
Your Claude subscription has hit its usage limit. It resets at 11:30am (UTC). Re-trigger Pullfrog after the reset, or add an Add repo secret → · Model settings → · Setup docs → · Ask in Discord →
|
|
Warning Your Claude subscription has reached its daily usage limit, blocking all Pullfrog runs until it resets. Every Pullfrog run on arcboxlabs has failed since September 7 (5 runs, no successes), so this review did not happen. Anthropic's Claude subscription has hit its daily usage limit, which resets at 11:30am UTC. Since no ANTHROPIC_API_KEY is stored as a fallback, every run that tries to use the Claude model fails when the subscription window is exhausted. To fix it:
|
992dff7 to
1d942a6
Compare
|
Your Claude subscription has hit its usage limit. It resets at 11:30am (UTC). Re-trigger Pullfrog after the reset, or add an Add repo secret → · Model settings → · Setup docs → · Ask in Discord →
|
|
Your Claude subscription has hit its usage limit. It resets at 11:30am (UTC). Re-trigger Pullfrog after the reset, or add an Add repo secret → · Model settings → · Setup docs → · Ask in Discord →
|
|
Your Claude subscription has hit its usage limit. It resets at 11:30am (UTC). Re-trigger Pullfrog after the reset, or add an Add repo secret → · Model settings → · Setup docs → · Ask in Discord →
|
There was a problem hiding this comment.
🟡 Changes recommended
The new graph-based prompt rewrite path still blocks (and strips) stored attachment refs in UserMessage, preventing non-destructive rewrites from preserving attachments as intended.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Review details
Suppressed comments (2)
packages/presentation/ui/src/chat/user-message.tsx:120
- When submitting an edit, stored attachment blocks are always stripped from
retainedBlocks, which would drop attachment refs on rewrite. With graph rewrites enabled, theseresource_linkattachment blocks should be preserved sopromptBlocksFromComposercan convert them intoattachment_refblocks on submit.
packages/presentation/ui/src/chat/user-message.tsx:93 - Edits are blocked whenever the prompt contains stored attachments (
resource_link→attachmentIdFromUri), but graph rewrites can submitattachment_refblocks (viapromptBlocksFromComposer) and should be allowed to rewrite prompts that include stored attachment refs. As-is, the UI showseditAttachmentsUnsupportedeven whenrewritesViaGraphis enabled and the message is a known graph node.
This issue also appears on line 115 of the same file.
- Files reviewed: 56/56 changed files
- Comments generated: 1
- Review effort level: Lite
There was a problem hiding this comment.
ℹ️ No critical issues — minor suggestions inline.
Reviewed changes — incremental re-review of the two commits since 4952b99:
fdda262fix(engine)—upload-service.tsgainsMAX_LIVE_UPLOADS = 32with areservedcounter released viaEffect.ensuring, aUPLOAD_IDLE_MS = 5 minidle reap that runs on the nextbegin, and asameDeclarationcheck that refuses a replayedoperationIdcarrying different declared fields instead of handing back another upload's id.8278289fix(client-core,workbench)— the attachment read walk now pins every page to the first page'sblobId/sizeBytes(plus offset, overrun, and empty-slice guards), anddev-mock-host.tsmirrors the daemon's begin-replay field check.
The bounding logic holds up. Effect.ensuring fires on success, failure, defect, and interruption, and the daemon forks each request through FiberSet.runtime, so exactly one reserve() pairs with one release() per admitted begin and hands off cleanly to live.size. sameDeclaration cannot false-refuse a legitimate replay either — attachment-store.beginUpload returns the caller's lease object verbatim, so name/mimeType round-trip unchanged. The new tests genuinely fail without their fixes: the cap test asserts exactly one refusal out of MAX_LIVE_UPLOADS + 1 concurrent begins (it would see zero without reserve()), and the reap test pins the exact UPLOAD_IDLE_MS - 1 boundary.
ℹ️ Stack sequencing
Both new commits fix the attachment-upload subsystem, which belongs to the PR below this one in the stack — the base here is ruocheng/code-637, not master. Merging bottom-up ships that PR with no live-upload cap, no idle stage reap, and an unpinned read walk, which are the exact surfaces these commits close. Worth confirming this is deliberate rather than a mis-targeted branch.
Technical details
Files touched by the two new commits and the layer that owns them:
packages/host/engine/src/attachment/upload-service.ts— attachment upload store (PR below)packages/client/core/src/client/attachment-channel.ts— attachment read channel (PR below)packages/client/workbench/src/mock/dev-mock-host.ts— mock parity for the above
Secondary: the PR body lists 10 commits against a commitCount of 16, and describes only version navigation / prompt rewrite. A reader landing here would not expect upload-bounding changes; refreshing the body would help whoever reviews the merge.
ℹ️ Nitpicks
packages/foundation/schema/src/wire/attachment.ts:36— the doc comment "a second begin with the same id returns the first" is now an understatement. Afterfdda262that holds only when the declared fields match; otherwise the begin is refused withinvalid_request. Not in this diff, so no inline anchor.
Claude Opus | 𝕏
…and frozen parked stores
…ds in the dev mock
… through the turn graph
…nge and refresh the tree on park
…om the session's first root
… settles, and hide unrun turns
…y parked reads, and continue from the last completed turn
…h refusals, cancelled settles, and admit order in the dev mock
…sks, pin read cursors to the item count, and match the mock's command text
…yed begin with other fields
…or the begin replay rule in the mock
…donly_file projections to adapters as file links
… cap its name in the handler
…type before the begin frame
…lings once, and forget the mock's begin replay on commit
…fork's copy of it
…poser never falls back to defaults
76e383b to
d60ecbc
Compare
|
Your organization has disabled Claude subscription access for Claude Code. Ask your Claude organization's admin to re-enable it in the Claude Console, or set an Add repo secret → · Model settings → · Setup docs → · Ask in Discord →
|
|
Warning Your Claude organization has disabled subscription access for Claude Code, so every run on the linkcode repo fails. Every Pullfrog run on arcboxlabs has failed since September 14 (5 runs, no successes), so this review did not happen. Every run on the linkcode repo fails with "Your organization has disabled Claude subscription access for Claude Code." The repo is pinned to To fix it:
|

Summary
Phase 4 of CODE-627 — Conversation turn graph & immutable attachment store. Linear: https://linear.app/arcbox/issue/CODE-638/featuiclient-version-navigation-and-non-destructive-prompt-rewrite
Stack: #516 ← this PR (
ruocheng/code-638, baseruocheng/code-637) ← top of the stack. Merge bottom-up; this PR's diff is only its own commits.Phase 4:
‹ 1/N ›version navigation from the graph's sibling ordinals, a client-local parked view (pure reads that never move the host default), and the non-destructive rewrite — editing prompt T submits a sibling under parent(T) throughturn.submit, sends from a parked version continue from its last completed turn, and failed or cancelled turns keep their ordinal and badge. Engine side: inactive lineages read their own history, a failed leaf's shared prefix reads from the live history, every settle re-announces the tree at the same revision, and a relaunch whose dispatch failed is unwound so the thread keeps its own history.This PR also carries the review-round fixes for the whole stack (the code they touch moved in this branch, and the stack merges as a unit): failed-turn attribution, the delete-time launch guard, the preceding-checkpoint binding, the upload cap and idle reap, the read-walk identity check, the inline image count, the
readonly_fileconversion, and the legacy upload frame's wire shape. Each is recorded on its own PR's thread and on CODE-627.Commits
Verification
Every commit passed
pnpm check:ciandpnpm testat its own tip; the stack tip (76e383bf) is atpnpm check:ci0 errors,pnpm test3428 passed / 1 skipped. Adversarial reviewers (one per axis, isolated read-only worktrees) reviewed the branch; each P1/P2 was reproduced with a failing test or a probe step before its fix — the round-by-round record, including the six bot review rounds on #507–#517, is in the Linear issue's comments. Headless-Chrome probe ofdev:mock: two prompts → edit →2/2(zero stale alerts during the edit) →‹1/2+ parked notice → Back to latest →failedit3/3 Failed→refuseedit3/4 Failed→›4/4 Failed→ send →5/5under the first turn; no console errors. The real-daemon edit path was then verified against live Claude Code (dev daemon, headless Chrome screenshots on CODE-627): it found three bugs the mock cannot show — a parked read carried the active run's live tail, the shared prefix rendered from the fork's re-stamped copy ("Thought for 10 seconds" vs "1 second"), and the parked composer fell back to defaults — fixed in the last three commits, after which both versions render their shared turns identically and the composer keeps policy, model, and effort while parked.Checklist
pnpm check:ciandpnpm testboth pass (no Rust changes)dev:mockin headless ChromeSessionRun.abandonedAt);resource.source.uploadkeeps its v79 shapeAGENTS.mdand module docs in this branch)